using System;
using System.Collections.Generic;
using System.Text;
//using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Runtime.CompilerServices;
using TXLooker.Common.Core;
using System.Reflection;
using TXLooker.Common.Outlook;
using Microsoft.Office.Interop.Outlook;
using System.Collections;

namespace TXLooker.Core
{
    //internal class TFServerProvider : SelfUpdater, ITFServerProvider
    //{
    //    public TFDataProvider TFDataProvider
    //    {
    //        get { return this.m_dataProvider; }
    //        internal set 
    //        {
    //            if( value == null ) throw new NullReferenceException();
    //            this.m_dataProvider = value; 
    //        }
    //    }
    //    private TFDataProvider m_dataProvider = null;

    //    #region Constructors

    //    protected TFServerProvider()
    //    {}
    //    public TFServerProvider( Uri serverUri, TFDataProvider dataProvider ) : this()
    //    {
    //        this.TFServerUri = serverUri;
    //        this.TFDataProvider = dataProvider;
    //    }
    //    public TFServerProvider(string serverUri, TFDataProvider dataProvider ) : this( new Uri(serverUri), dataProvider )
    //    { }

    //    #endregion Constructors

    //    #region ITFServerProvider Members

    //    public Uri TFServerUri
    //    {
    //        get { return this.m_serverURI; }
    //        protected set 
    //        {
    //            if( value == null ) throw new NullReferenceException();
    //            this.m_serverURI = value;
    //        }
    //    }
    //    private Uri m_serverURI = null;

    //    public object SyncObject
    //    {
    //        get { return this.m_syncObject; }
    //    }
    //    private object m_syncObject = new object();

    //    public WorkItemStore GetStore()
    //    {
    //        return this.TFDataProvider.GetStore(this.TFServerUri);
    //    }

    //    public Microsoft.Office.Interop.Outlook.MAPIFolder Folder
    //    {
    //        get { return this.m_folder; }
    //        set 
    //        {
    //            if( value == null )
    //                throw new NullReferenceException();

    //            this.m_folder = value;
    //        }
    //    }
    //    private Microsoft.Office.Interop.Outlook.MAPIFolder m_folder = null;

    //    public string ServerName
    //    {
    //        get { return this.TFServerUri.Host; }
    //    }

    //    #endregion ITFServerProvider

    //    public override void Update()
    //    {
    //        WorkItemStore store = null;

    //        try   { store = this.GetStore(); }
    //        catch { }

    //        if( store == null ) return;

    //        //remember previous state
    //        IList<TFProjectProvider> prevState = this.GetProjectProviders();

    //        lock( (store.Projects as ICollection).SyncRoot )
    //        {
    //            foreach( Project project in store.Projects )
    //            {
    //                if( !IsProjectProcess(project.Uri) )
    //                    continue;

    //                TFProjectProvider projectProvider = this.GetProjectProvider( project.Uri );

    //                if( projectProvider == null )
    //                {
    //                    projectProvider = new TFProjectProvider( this, project.Uri );
    //                    projectProvider.Folder = this.Folder.Folders.Add( string.Format("Project: {0}", project.Name), Missing.Value );
    //                    projectProvider.Folder.WebViewURL = ApplicationGlobal.GetWebViewURL( ApplicationGlobal.WebViewType.Project );
    //                    projectProvider.Folder.WebViewOn = true;

    //                    //add new server
    //                    this.AddTFProject( projectProvider );
    //                }
    //                else
    //                {
    //                    prevState.Remove( projectProvider );
    //                }

    //                //update server content
    //                projectProvider.Update();
    //            }
    //        }

    //        //remove old items
    //        foreach( TFProjectProvider item in prevState )
    //        {
    //            this.RemoveTFProject(item);
    //            OutlookGlobal.RemoveFolderByID( this.Folder, item.Folder.EntryID );
    //        }
    //    }

    //    #region Projects

    //    /// <summary>
    //    /// 
    //    /// </summary>
    //    public IEnumerable<ITFProjectProvider> ServerProjects
    //    {
    //        get 
    //        {
    //            foreach( TFProjectProvider item in this.GetProjectProviders() )
    //                yield return item;
    //        }
    //    }

    //    /// <summary>
    //    /// 
    //    /// </summary>
    //    public IList<TFProjectProvider> GetProjectProviders()
    //    {
    //        List<TFProjectProvider> resultList = new List<TFProjectProvider>();

    //        lock( this.m_syncProjectsMap )
    //        {
    //            foreach( TFProjectProvider item in this.m_projectsMap.Values )
    //                resultList.Add(item);
    //        }

    //        return resultList;
    //    }

    //    public ITFProjectProvider GetProject( string projectUri )
    //    {
    //        return this.GetProjectProvider( projectUri );
    //    }
    //    public ITFProjectProvider GetProject( Uri projectUri )
    //    { 
    //        return this.GetProjectProvider( projectUri );
    //    }

    //    /// <summary>
    //    /// 
    //    /// </summary>
    //    public TFProjectProvider GetProjectProvider( string projectURI )
    //    {
    //        lock( this.m_syncProjectsMap )
    //        {
    //            return ( this.m_projectsMap.ContainsKey( projectURI ) ) ? m_projectsMap[projectURI] : null;
    //        }
    //    }
    //    public TFProjectProvider GetProjectProvider( Uri projectURI )
    //    {
    //        return GetProjectProvider( projectURI.ToString() );
    //    }

    //    /// <summary>
    //    /// project list
    //    /// </summary>
    //    private Dictionary<string, TFProjectProvider> m_projectsMap = new Dictionary<string, TFProjectProvider>();
    //    /// <summary>
    //    /// Synchronization object for 'm_projects' list
    //    /// </summary>
    //    private object m_syncProjectsMap = new object();

    //    #region Add Project

    //    public event TFEventHandler<ITFProjectProvider> AddProject
    //    {
    //        [MethodImpl(MethodImplOptions.Synchronized)]
    //        add { this.OnAddProjectEH += value; }
    //        [MethodImpl(MethodImplOptions.Synchronized)]
    //        remove { this.OnAddProjectEH -= value; }
    //    }
    //    private TFEventHandler<ITFProjectProvider> OnAddProjectEH = null;

    //    private void RaiseAddProjectEH( ITFProjectProvider project )
    //    {
    //        if( this.OnAddProjectEH != null )
    //            this.OnAddProjectEH( project );
    //    }

    //    private void AddTFProject( TFProjectProvider provider )
    //    {
    //        string projectUri = provider.TFProjectUri.ToString();

    //        lock( this.m_syncProjectsMap )
    //        {
    //            if( this.m_projectsMap.ContainsKey(projectUri) )
    //                return;

    //            this.m_projectsMap.Add( projectUri, provider );
    //        }

    //        this.RaiseAddProjectEH(provider);
    //    }

    //    #endregion Add Project

    //    #region Remove Project

    //    public event TFEventHandler<ITFProjectProvider> RemoveProject
    //    {
    //        [MethodImpl( MethodImplOptions.Synchronized )]
    //        add { this.OnRemoveProjectEH += value; }
    //        [MethodImpl( MethodImplOptions.Synchronized )]
    //        remove { this.OnRemoveProjectEH -= value; }
    //    }
    //    private TFEventHandler<ITFProjectProvider> OnRemoveProjectEH = null;

    //    private void RaiseRemoveProjectEH( ITFProjectProvider provider )
    //    {
    //        if( this.OnRemoveProjectEH != null )
    //            this.OnRemoveProjectEH( provider );
    //    }

    //    private void RemoveTFProject(string projectUri)
    //    {
    //        TFProjectProvider provider = null;

    //        lock( this.m_syncProjectsMap )
    //        {
    //            if( !this.m_projectsMap.ContainsKey(projectUri) )
    //                return;

    //            provider = this.m_projectsMap[projectUri];

    //            //if( this.Folder != null )
    //            //    OutlookGlobal.RemoveFolderByName( this.Folder, provider.GetProject().Name );

    //            this.m_projectsMap.Remove( projectUri );
    //        }

    //        this.RaiseRemoveProjectEH(provider);
    //    }
    //    private void RemoveTFProject( TFProjectProvider projectProvider )
    //    {
    //        this.RemoveTFProject(projectProvider.TFProjectUri);
    //    }
    //    private void RemoveTFProject( Uri projectUri )
    //    {
    //        this.RemoveTFProject( projectUri.ToString() );
    //    }

    //    public void RemoveAllProjects()
    //    {
    //        IList<TFProjectProvider> projects = GetProjectProviders();

    //        foreach( TFProjectProvider item in projects )
    //            this.RemoveTFProject( item );
    //    }

    //    #endregion Remove Project

    //    #endregion Projects

    //    private bool IsProjectProcess(string uri)
    //    {
    //        lock(this.m_syncProjectURIs)
    //        {
    //            return this.m_projectURIs.Contains(uri);
    //        }
    //    }
    //    private bool IsProjectProcess(Uri uri)
    //    {
    //        return this.IsProjectProcess( uri.ToString() );
    //    }
    //    /// <summary>
    //    /// Set project URIs wich will be processed
    //    /// </summary>
    //    public void SetProcessProjects( IEnumerable<string> projectURIs )
    //    {
    //        if( projectURIs == null )
    //            throw new ArgumentException();

    //        lock( this.m_syncProjectURIs )
    //        {
    //            this.m_projectURIs.Clear();

    //            foreach( string uri in projectURIs )
    //            {
    //                if( this.m_projectURIs.Contains(uri) )
    //                    continue;

    //                this.m_projectURIs.Add( uri );
    //            }
    //        }

    //    }
    //    private List<string> m_projectURIs = new List<string>();
    //    private object m_syncProjectURIs = new object();


    //}
}
